home *** CD-ROM | disk | FTP | other *** search
- *******************************************************
- ** XFD external decruncher for JR Cruncher **
- ** written by Mr. Larmer / Wanted Team **
- ** shortened and fixed by SDI in 1999 **
- *******************************************************
-
- INCLUDE "AINCLUDE:IncDirs.i"
- INCLUDE "libraries/xfdmaster.i"
- INCLUDE "lvo.i"
-
- * head function for tests
- * INCLUDE "xfdExeHead.a"
-
- ; xfdForeman structure MUST be first thing in all external decrunchers
-
- ForeMan moveq #-1,d0 ;security
- rts
- dc.l XFDF_ID ;id
- dc.w 1 ;version
- dc.w 0
- dc.l 0,0 ;private
- dc.l S_JR ;first slave
-
- **************************************************
-
- dc.b "$VER: JR 2.0 (25.07.1999)",0
- N_JR dc.b "(JR) Data Cruncher",0
- EVEN
-
- **************************************************
-
- ; xfdSlave structure: this one doesn't support segment decrunching
-
- S_JR dc.l 0 ;no more slaves
- dc.w 2 ;version
- dc.w 39 ;master version
- dc.l N_JR ;name
- dc.w XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
- dc.w 0
- dc.l RB_JR ;recog buffer
- dc.l DB_JR ;decrunch buffer
- dc.l 0 ;recog segment
- dc.l 0 ;decrunch segment
- dc.w 0,0
- dc.l 12+2
-
- ;-------------------------------------------------
-
- ; Recog buffer function: receives buffer + length in a0/d0
-
- RB_JR MOVEQ #0,D0
- CMP.W #"JR",(A0)
- BNE.B .Exit
- TST.B 4(A0)
- BNE.B .Exit
- MOVE.L 4(A0),D0
- MOVE.L D0,xfdrr_FinalTargetLen(A1)
- MOVE.L D0,xfdrr_MinTargetLen(A1)
- MOVEQ #1,D0
- .Exit RTS
-
- ;-------------------------------------------------
-
- ;Decrunch buffer function: receives bufferinfo in a0
-
- * this functions uses D0-D2,A0-A2
-
- DB_JR MOVEM.L D2/A2-A5,-(A7)
- MOVE.L A0,A5
- MOVE.L xfdbi_UserTargetBuf(A5),A1
- MOVE.L xfdbi_SourceBuffer(A5),A0
- MOVE.L A1,A3
- ADD.L xfdbi_TargetBufSaveLen(A5),A3
-
- moveq #7,D2
- .JR_01 move.b (A0)+,D1
- dbra D2,.JR_01
- moveq #-$80,D2
- bra.w .JR_18
-
- .JR_02 lsr.w #1,D1
- subq.w #1,D1
- .JR_03 add.b D2,D2
- bne.b .JR_04
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_04 addx.w D0,D0
- dbra D1,.JR_03
- moveq #3,D1
- add.w D0,D1
- add.w D1,D1
- LEA (A1,D1.W),A4 *
- ADD.W D1,A4 *
- CMP.L A3,A4 *
- BHI.W .Err * test copy
- subq.w #1,D1
- .JR_05 move.b (A0)+,(A1)+
- move.b (A0)+,(A1)+
- dbra D1,.JR_05
- bra.w .JR_21
-
- .JR_06 add.b D2,D2
- bne.b .JR_07
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_07 addx.w D1,D1
- add.b D2,D2
- bne.b .JR_08
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_08 bcc.b .JR_10
- subq.w #1,D1
- add.b D2,D2
- bne.b .JR_09
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_09 addx.w D1,D1
- cmpi.b #9,D1
- beq.b .JR_02
- .JR_10 add.b D2,D2
- bne.b .JR_11
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_11 bcc.b .JR_16
- add.b D2,D2
- bne.b .JR_12
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_12 addx.w D0,D0
- add.b D2,D2
- bne.b .JR_13
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_13 bcs.b .JR_27
- tst.w D0
- bne.b .JR_16
- addq.w #1,D0
- .JR_14 add.b D2,D2
- bne.b .JR_15
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_15 addx.w D0,D0
- .JR_16 rol.w #8,D0
- move.b (A0)+,D0
- movea.l A1,A2
- suba.w D0,A2
- subq.w #1,A2
- LEA (A1,D1.W),A4 *
- CMP.L A3,A4 * test copy
- BHI.B .Err
- subq.w #1,D1
- .JR_17 move.b (A2)+,(A1)+
- dbra D1,.JR_17
- bra.b .JR_21
-
- .JR_18 add.b D2,D2
- bne.b .JR_19
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_19 bcs.b .JR_23
- .JR_20 CMP.L A3,A1
- BHS.B .Err * test copy
- move.b (A0)+,(A1)+
- .JR_21 add.b D2,D2
- bne.b .JR_22
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_22 bcc.b .JR_20
- .JR_23 moveq #2,D1
- moveq #0,D0
- add.b D2,D2
- bne.b .JR_24
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_24 bcc.w .JR_06
- add.b D2,D2
- bne.b .JR_25
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_25 bcc.b .JR_16
- addq.w #1,D1
- add.b D2,D2
- bne.b .JR_26
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_26 bcc.w .JR_10
- move.b (A0)+,D1
- beq.b .End
- addq.w #8,D1
- bra.w .JR_10
-
- .JR_27 add.b D2,D2
- bne.b .JR_28
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_28 addx.w D0,D0
- ori.w #4,D0
- add.b D2,D2
- bne.b .JR_29
- move.b (A0)+,D2
- addx.b D2,D2
- .JR_29 bcs.b .JR_16
- bra.w .JR_14
-
- .End CMP.L A1,A3
- BNE.B .Err
- MOVEQ #1,D0
- .out MOVEM.L (A7)+,D2/A2-A5
- RTS
-
- .Err MOVE.W #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
- MOVEQ #0,D0
- BRA.B .out
-
- END
-